package cn.iocoder.yudao.module.wecom.service.user;

import java.util.*;
import javax.validation.*;

import cn.iocoder.yudao.module.system.api.oauth2.dto.OAuth2AccessTokenRespDTO;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import cn.iocoder.yudao.module.wecom.controller.admin.user.vo.*;
import cn.iocoder.yudao.module.wecom.controller.admin.user.vo.WeComQuickLoginReqVo;
import cn.iocoder.yudao.module.wecom.dal.dataobject.user.WeUserDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;

/**
 * 企微员工 Service 接口
 *
 * @author 数创万维
 */
public interface WeUserService {

    /**
     * 创建企微员工
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createWeUser(@Valid WeUserSaveReqVO createReqVO);

    /**
     * 更新企微员工
     *
     * @param updateReqVO 更新信息
     */
    void updateWeUser(@Valid WeUserSaveReqVO updateReqVO);

    /**
     * 删除企微员工
     *
     * @param id 编号
     */
    void deleteWeUser(Long id);

    /**
     * 获得企微员工
     *
     * @param id 编号
     * @return 企微员工
     */
    WeUserDO getWeUser(Long id);

    /**
     * 获得企微员工分页
     *
     * @param pageReqVO 分页查询
     * @return 企微员工分页
     */
    PageResult<WeUserDO> getWeUserPage(WeUserPageReqVO pageReqVO);

    /**
     * 同步企业员工通讯录
     * @since 2024-07-12
     * @author PetePower
     * @return
     */
    Boolean syncWeUser();

    /**
     * 绑定crm员工和企微员工
     * 1. 使用code 和suitAccessToken 获取用户userid
     * 2. 使用userid 和UserTicket 获取用户敏感信息（头像，二维码）
     * @since 2024-07-15
     * @author PetePower
     * @return
     */
    Boolean bindWeUser(String state, String code);

    /**
     * 企微用户登录， 并返回accessToken等令牌信息
     * @param code 临时授权码
     * @since 2024-09-20
     * @author PetePower
     */
    OAuth2AccessTokenRespDTO weUserLogin(String code);

    OAuth2AccessTokenRespDTO weUserLoginInner(String code);

    /**
     * 使用企业id和用户id快捷登录
     * @return
     */
    OAuth2AccessTokenRespDTO weUserQuickLogin(WeComQuickLoginReqVo reqVo);

    AdminUserRespDTO bindUser(String weUserid, String openUserId, Long sysUserId);

    /**
     * 构建企业微信用户授权登录链接
     * @since 2024-07-15
     * @author PetePower
     * @return
     */
    String getAuthUrl(Long tenantId, Long userId);

    /**
     * 处理新增通讯录联系人
     * @param allFieldsMap
     * @since 2024-07-12
     * @author PetePower
     */
    void createEventHandle(Map<String, Object> allFieldsMap);

    /**
     * 处理更新通讯录联系人
     * @param allFieldsMap
     * @since 2024-07-12
     * @author PetePower
     */
    void updateEventHandle(Map<String, Object> allFieldsMap);

    void resetUserNameEventHandle(Map<String, Object> allFieldsMap);

    void deleteUserEventHandle(Map<String, Object> allFieldsMap);

    /**
     * 获取已绑定的企业微信用户
     * @since 2024-07-15
     * @author PetePower
     * @return
     */
    WeUserRespVO getBindUser();

    /**
     * 解除企微用户绑定
     * @since 2024-09-10
     * @author PetePower
     */
    void unBindUser();

    /**
     * 根据微信用户id获取用户id
     * @param weUserId
     * @since 2024-09-02
     * @author PetePower
     * @return
     */
    Long getUserIdByWeUserId(String weUserId);

    /**
     * 获取用户绑定状态map
     * @param sysUserIdList
     * @since 2024-08-06
     * @author PetePower
     * @return
     */
    Map<Long, WeUserDO> getWeUserBindStatus(List<Long> sysUserIdList);


    /**
     * 获取员工map
     * @param weUserIdList
     * @since 2024-08-06
     * @author PetePower
     * @return
     */
    Map<String, WeUserDO> getWeUserMap(List<String> weUserIdList);

    /**
     * 获取简单列表
     * @since 2024-08-07
     * @author PetePower
     * @return
     */
    List<WeUserDO> getWeUserList(String name);

    /**
     * 根据authCode 获取授权登录的用户id
     * @param code
     * @since 2024-09-28
     * @author PetePower
     * @return
     */
    String getUserIdByAuthCode(String code);

    /**
     * 根据sysUserId 获取已绑定的weUserId
     * @param loginUserId
     * @since 2024-10-08
     * @author PetePower
     * @return
     */
    String getWeUserIdBySysUserId(Long loginUserId);
}